package io.renren.modules.iots.utils.bak.socket;

/**
 * Created by gn on 0029 2015-07-29.
 */


import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;

/**
 * @ClassName: TCPClient
 * @Description: TCP链接
 * @author 周西栋
 * @date 2018年5月8日
 *
 */
public class TCPClient {
    /**
     *  信道选择器
     */
    private Selector selector;

    /**
     *  与服务器通信的信道
     */
    SocketChannel socketChannel;

    /**
     *  要连接的服务器Ip地址
     */
    private String hostIp;

    /**
     *  要连接的远程服务器在监听的端口
     */
    private int hostListenningPort;
    
    /**
     * 创建一个新的实例 TCPClient.
     *
     * @param HostIp
     * @param HostListenningPort
     * @throws IOException
     */
    public TCPClient(String HostIp, int HostListenningPort) throws IOException {
        this.hostIp = HostIp;
        this.hostListenningPort = HostListenningPort;
        initialize();
    }


    /**
     * @Title: initialize
     * @Description: 初始化
     * @param @throws IOException    参数
     * @return void    返回类型
     * @throws
     */
    private void initialize() throws IOException {
        try {
            // 获得一个Socket通道
            SocketChannel channel = SocketChannel.open();
            // 设置通道为非阻塞
            channel.configureBlocking(false);
            // 获得一个通道管理器
            this.selector = Selector.open();
            // 客户端连接服务器,其实方法执行并没有实现连接，需要在listen（）方法中调
            //用channel.finishConnect();才能完成连接
            channel.connect(new InetSocketAddress(hostIp, hostListenningPort));
            //将通道管理器和该通道绑定，并为该通道注册SelectionKey.OP_CONNECT事件。
            channel.register(selector, SelectionKey.OP_CONNECT);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        // 拿到Socket链接线程，并将selector交给该线程管理
        SingleSocketClientThread thread = SingleSocketClientThread.getInstance();
        // 注册到管理器中
        thread.put((hostIp+":"+hostListenningPort),selector);
    }
}